/*
 * @Date         : 2022-02-21 10:15:12
 * @LastEditors  : zu1662
 * @LastEditTime : 2022-03-03 19:45:34
 * @Description  : 用户公共存储库
 * 
 * Copyright © 2022 by zu1662, All Rights Reserved. 
 */
import { makeAutoObservable } from 'mobx';
import {
  reqInfo, reqLogin, reqLogout, reqMenu,
} from '@/apis/user';
import { IRoute } from '@/types/router';
import { UserInfo, UserLoginForm, UserLoginRes } from '@/types/user';
import { getToken, removeToken, setToken } from '@/utils/storage';
import { typeValidate } from '@/utils/validate';
import generalAccessRoutes from './permission';
import { ResponseData } from '@/utils/request';

// 用户相关 存储库
export class UserStore {
  // 用户信息
  userInfo: UserInfo | null = null

  // 登录 Token
  token: string = getToken()

  // 用户权限菜单
  menus: IRoute[] = []

  constructor() {
    // 设置监听 对应的初始化应该在上方
    // 使用 autoBind 可以设置 this 指向当前 对象。下面方法不使用 => 函数也可正常，否则会报 undefind 错误
    makeAutoObservable(this, {}, { autoBind: true });
  }

  // 更新 Token
  setToken(val: string) {
    this.token = val;
    // Token 存入
    setToken(val);
  }

  // 清除 Token
  clearToken () {
    this.token = '';
    removeToken();
  }

  // 用户登录
  login (loginForm: UserLoginForm) {
    return new Promise<ResponseData<UserLoginRes>>((resolve, reject) => {
      reqLogin(loginForm)
        .then((res) => {
          if (res.code) {
            const { token } = res.data;
            this.setToken(token);
            resolve(res);
          } else {
            reject(res.msg);
          }
        })
        .catch((err) => {
          reject(err);
        });
    });
  }

  // 用户退出
  logout () {
    return new Promise((resolve, reject) => {
      reqLogout().then((res) => {
        if (res.code) {
          this.clearToken();
          this.clearUserInfo();
          this.clearMenus();
          resolve(res);
        } else {
          reject(res.msg);
        }
      }).catch((err) => {
        reject(err);
      });
    });
  }

  // 获取用户信息
  getUserInfo ()  {
    return new Promise((resolve, reject) => {
      reqInfo().then((res) => {
        console.log('userInfo--->', res);
        if (res.code) {
          this.setUserInfo(res.data)
          resolve(res.data);
        } else {
          reject(res.msg);
        }
      }).catch((err) => {
        reject(err);
      });
    });
  }

  // 重置用户信息
  clearUserInfo () {
    this.userInfo = null;
  }

  // 更新 userinfo
  setUserInfo(val: UserInfo) {
    this.userInfo = val;
  }

  // 获取用户的菜单权限信息
  getMenus () {
    return new Promise((resolve, reject) => {
      reqMenu().then((res) => {
        if (res.code) {
          const menuDatas = res.data;
          if (menuDatas && typeValidate.isArray(menuDatas)) {
            const accessedRouters = generalAccessRoutes(menuDatas);
            this.setMenus(accessedRouters)
            console.log('menus--->',this.menus);
          }
          resolve(res.data);
        } else {
          reject(res.msg);
        }
      }).catch((err) => {
        reject(err);
      });
    });
  }

  // 重置菜单信息
  clearMenus () {
    this.menus = [];
  }

  // 更新 menus
  setMenus(val: IRoute[]) {
    this.menus = val;
  }
}

export default UserStore;
